/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sistemperpustakaan.controller;

import java.io.File;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.sax.SAXSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperPrintManager;
import net.sf.jasperreports.view.JasperViewer;
import sistemperpustakaan.component.PdfFilter;
import sistemperpustakaan.entity.Anggota;
import sistemperpustakaan.entity.TypeAnggota;
import sistemperpustakaan.model.AnggotaModel;
import sistemperpustakaan.tablemodel.AnggotaTableModel;
import sistemperpustakaan.utility.DateUtility;
import sistemperpustakaan.utility.FilterUtility;
import sistemperpustakaan.view.anggota.DialogAnggotaDetail;
import sistemperpustakaan.view.anggota.FrmAnggotaView;

/**
 *
 * @author EKo
 */
public class AnggotaController {

    FrmAnggotaView anggotaView;
    DialogAnggotaDetail anggotaDetail;
    Anggota anggota;
    DateUtility du = new DateUtility();
    AnggotaModel model;

    public AnggotaController() {
    }

    public AnggotaController(FrmAnggotaView anggotaView, AnggotaModel model) {
        this.anggotaView = anggotaView;
        this.model = model;
    }

    public AnggotaModel getModel() {
        return model;
    }

    public void setAnggotaDetail(DialogAnggotaDetail anggotaDetail) {
        this.anggotaDetail = anggotaDetail;
    }

    public FrmAnggotaView getAnggotaView() {
        return anggotaView;
    }

    public DialogAnggotaDetail getAnggotaDetail() {
        return anggotaDetail;
    }

    public void findListAnggota() {
        int idAnggota = -1;
        if (!anggotaView.getTxtId().getText().equals("")) {
            try {
                idAnggota = Integer.valueOf(anggotaView.getTxtId().getText());
            } catch (Exception e) {
                JOptionPane.showMessageDialog(anggotaView, "Field ini harus diisi dengan angka");
                anggotaView.getTxtId().setText("");
                idAnggota = -1;
            }
        }
        anggotaView.setTableModel(new AnggotaTableModel());
        anggotaView.getTableModel().setListAnggota(model.getListAnggota(
                idAnggota,
                anggotaView.getTxtNis().getText(),
                anggotaView.getTxtNama().getText(),
                anggotaView.getComboTypeAnggota().getSelectedItem().toString()));
        anggotaView.getTableAnggota().setModel(anggotaView.getTableModel());
        anggotaView.setTableView();
        anggotaView.setAnggotaId(-1);

        int jumlah = anggotaView.getTableAnggota().getRowCount();
        anggotaView.getLblJumlah().setText(Integer.toString(jumlah));
    }

    public void refreshListAnggota() {
        anggotaView.getTxtId().setText("");
        anggotaView.getTxtNis().setText("");
        anggotaView.getTxtNama().setText("");
        anggotaView.getComboTypeAnggota().setSelectedIndex(0);
        findListAnggota();
    }

    public void saveNewAnggota() {
        int jenisKelamin;
        if (anggotaDetail.getRadioLakiLaki().isSelected()) {
            jenisKelamin = 0;
        } else {
            jenisKelamin = 1;
        }
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        Date date = new Date();
        //anggotaDetail.getDateTglLahir().setDate(date);
        String tanggal = df.format(anggotaDetail.getDateTglLahir().getDate());
//        System.out.println(tanggal);
        if (anggotaDetail.getTxtId().getText().equals("")) {
            JOptionPane.showMessageDialog(anggotaView, "ID Masih Kosong");
        } else if (anggotaDetail.getTxtNis().getText().equals("")) {
            JOptionPane.showMessageDialog(anggotaView, "NIS/NIK Masih Kosong");
        } else if (anggotaDetail.getTxtNama().getText().equals("")) {
            JOptionPane.showMessageDialog(anggotaView, "Nama Masih Kosong");
        } else if (anggotaDetail.getTxtIdType().getText().equals("0")) {
            JOptionPane.showMessageDialog(anggotaView, "Type Anggota Masih Kosong");
        } //        else if (anggotaDetail.getTxtTempatLahir().getText().equals("")) {
        //            JOptionPane.showMessageDialog(anggotaView, "Tempat Lahir Masih Kosong");
        //        } else if (anggotaDetail.getTxtAlamat().getText().equals("")) {
        //            JOptionPane.showMessageDialog(anggotaView, "Alamat Masih Kosong");
        //        } else if (anggotaDetail.getTxtEmail().getText().equals("")) {
        //            JOptionPane.showMessageDialog(anggotaView, "Email Masih Kosong");
        //        } else if (anggotaDetail.getTxtTelepon().getText().equals("")) {
        //            JOptionPane.showMessageDialog(anggotaView, "Telepon Masih Kosong");
        //        }
        else {
            tanggal = df.format(anggotaDetail.getDateTglLahir().getDate());

            if (model.insertAnggota(
                    Integer.valueOf(anggotaDetail.getTxtId().getText()),
                    anggotaDetail.getTxtNis().getText(),
                    Integer.valueOf(anggotaDetail.getTxtIdType().getText()),
                    anggotaDetail.getTxtNama().getText(),
                    jenisKelamin,
                    anggotaDetail.getTxtTempatLahir().getText(),
                    //                du.createDate(anggotaDetail.getTxtTglLahir().getText()),
                    tanggal,
                    anggotaDetail.getTxtAlamat().getText(),
                    anggotaDetail.getTxtTelepon().getText(),
                    anggotaDetail.getTxtEmail().getText())) {
                JOptionPane.showMessageDialog(anggotaView, "Simpan Data anggota sukses");
                findListAnggota();
                anggotaDetail.dispose();
            } else {
                JOptionPane.showMessageDialog(anggotaView, "Simpan Data anggota gagal");
            }
        }
    }

    public void saveUpdateAnggota() {
        int jenisKelamin;
        if (anggotaDetail.getRadioLakiLaki().isSelected()) {
            jenisKelamin = 0;
        } else {
            jenisKelamin = 1;
        }
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        Date date = new Date();
        //anggotaDetail.getDateTglLahir().setDate(date);
        String tanggal = df.format(anggotaDetail.getDateTglLahir().getDate());
        if (anggotaDetail.getTxtId().getText().equals("")) {
            JOptionPane.showMessageDialog(anggotaView, "ID Masih Kosong");
        } else if (anggotaDetail.getTxtNis().getText().equals("")) {
            JOptionPane.showMessageDialog(anggotaView, "NIS/NIK Masih Kosong");
        } else if (anggotaDetail.getTxtNama().getText().equals("")) {
            JOptionPane.showMessageDialog(anggotaView, "Nama Masih Kosong");
        } else if (anggotaDetail.getTxtIdType().getText().equals("0")) {
            JOptionPane.showMessageDialog(anggotaView, "Type Anggota Masih Kosong");
        } //        else if (anggotaDetail.getTxtTempatLahir().getText().equals("")) {
        //            JOptionPane.showMessageDialog(anggotaView, "Tempat Lahir Masih Kosong");
        //        } else if (anggotaDetail.getTxtAlamat().getText().equals("")) {
        //            JOptionPane.showMessageDialog(anggotaView, "Alamat Masih Kosong");
        //        } else if (anggotaDetail.getTxtEmail().getText().equals("")) {
        //            JOptionPane.showMessageDialog(anggotaView, "Email Masih Kosong");
        //        } else if (anggotaDetail.getTxtTelepon().getText().equals("")) {
        //            JOptionPane.showMessageDialog(anggotaView, "Telepon Masih Kosong");
        //        }
        else {
//            anggota = createAnggota();
//            anggota.setId(Integer.valueOf(anggotaDetail.getTxtId().getText()));
            tanggal = df.format(anggotaDetail.getDateTglLahir().getDate());
            if (model.updateAnggota(
                    Integer.valueOf(anggotaDetail.getTxtId().getText()),
                    anggotaDetail.getTxtNis().getText(),
                    Integer.valueOf(anggotaDetail.getTxtIdType().getText()),
                    anggotaDetail.getTxtNama().getText(),
                    jenisKelamin,
                    anggotaDetail.getTxtTempatLahir().getText(),
                    //                du.createDate(anggotaDetail.getTxtTglLahir().getText()),
                    tanggal,
                    anggotaDetail.getTxtAlamat().getText(),
                    anggotaDetail.getTxtTelepon().getText(),
                    anggotaDetail.getTxtEmail().getText(),
                    anggotaView.getAnggotaId())) {
                JOptionPane.showMessageDialog(anggotaView, "Update Data anggota sukses");
                findListAnggota();
                anggotaDetail.dispose();
            } else {
                JOptionPane.showMessageDialog(anggotaView, "Update Data anggota gagal");
            }
        }
    }

    public void saveDeleteAnggota() {
        if (JOptionPane.showConfirmDialog(anggotaView, "Apakah anda yakin menghapus data ini?", "Hapus data",
                JOptionPane.YES_NO_CANCEL_OPTION) == JOptionPane.YES_OPTION) {
            if (model.deleteAnggota(anggotaView.getAnggotaId())) {
                JOptionPane.showMessageDialog(anggotaView, "Delete data Anggota sukses");
                findListAnggota();
            } else {
                JOptionPane.showMessageDialog(anggotaView, "Delete data Anggota gagal");
            }
        }
    }

    public void setSelectedTypeAnggota(int idType) {
        TypeAnggota typeAnggota = model.getTypeAnggota(idType);
        anggotaDetail.getTxtIdType().setText(typeAnggota.getId() + "");
        anggotaDetail.getComboType().setSelectedIndex(idType);
    }

    public void fillComboType(JComboBox comboBox) {
        comboBox.setModel(new DefaultComboBoxModel(model.getVectorTypeAnggota()));
    }

    public void showDetailAnggota(int id) {
        try {
            anggota = model.getAnggota(id);
            anggotaDetail.getTxtId().setText(anggota.getId() + "");
            anggotaDetail.getTxtNis().setText(anggota.getNis_nik());
            anggotaDetail.getTxtIdType().setText(anggota.getType() + "");

            int index = anggota.getType();
            anggotaDetail.getComboType().setSelectedIndex(index);

            //setSelectedType(anggota.getType());
            anggotaDetail.getTxtNama().setText(anggota.getNama());
            anggotaDetail.getTxtTempatLahir().setText(anggota.getKota_lahir());

//            anggotaDetail.getTxtTglLahir().setText(anggota.getTanggal_lahir().toString());
            anggotaDetail.getDateTglLahir().setDate(anggota.getTanggal_lahir());

            anggotaDetail.getTxtAlamat().setText(anggota.getAlamat());
            anggotaDetail.getTxtTelepon().setText(anggota.getTelepon());
            anggotaDetail.getTxtEmail().setText(anggota.getEmail());

            if (anggota.getJenisKelamin() == 0) {
                anggotaDetail.getRadioLakiLaki().setSelected(true);
            } else {
                anggotaDetail.getRadioPerempuan().setSelected(true);
            }

        } catch (Exception e) {
        }
    }

    public void showGenerateIdAnggota() {
        Anggota anggota = model.generateIdAnggota();
        anggotaDetail.getTxtId().setText(anggota.getId() + "");
    }

//    public void viewReport() {
//        try {
//            Map<String, Object> map = new HashMap<String, Object>();
//            map.put("id", -1);
//            File report_file = new File("report/AnggotaReport.jasper");//acces file.jasper dari directory report yang ada didalam project.
//            JasperReport jasperReport = (JasperReport) JRLoader.loadObject(report_file.getPath());
//            JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, map, model.getConnection());
//            JasperViewer.viewReport(jasperPrint, false);
////            JasperViewer.setDefaultLookAndFeelDecorated(true);
//        } catch (Exception e) {
//            JOptionPane.showMessageDialog(null, "Data tidak dapat dicetak!" + "\n" + e.getMessage(), "Cetak Data", JOptionPane.ERROR_MESSAGE);
//        }
//    }
    public void report(int opt) {
        InputStream stream = getClass().getResourceAsStream("report/AnggotaReport.jasper");
        String logo = "C:\\logo.jpg";
        Map<String, Object> map = new HashMap<String, Object>();
        int id = anggotaView.cekId();
//        System.out.println(opt);
//        System.out.println(id);
//        String nis = anggotaView.getTxtNis().getText();

        map.put("id", id);
        map.put("nis", anggotaView.cekNis().toString());
        map.put("nama", anggotaView.cekNama().toString());
        map.put("type", anggotaView.cekType().toString());
        map.put("logo", logo);

        try {
            JasperPrint jasperPrint = JasperFillManager.fillReport(stream, map, model.getConnection());
            switch (opt) {
                case 0:
                    System.out.println("mlebu opt");
                    JasperViewer.viewReport(jasperPrint, false);
                    break;
                case 1:
                    JasperPrintManager.printReport(jasperPrint, true);
                    break;
//                case 2:
//                            JFileChooser fc = new JFileChooser();
//                            fc.setFileFilter(new PdfFilter());
//                            int returnValue = fc.showSaveDialog(anggotaView);
//                            if(returnValue == JFileChooser.APPROVE_OPTION){
//                                File f = fc.getSelectedFile();
//                                String path = f.getPath();
//                                String ext = FilterUtility.getExtension(f);
//                                if(ext != "pdf" ) path += ".pdf";
//                                JasperPrintManager.printReportToPdfFile(jasperPrint, path);
////                                JasperPrintManager.printReportToPdfFile(ext, ext);
//                                JOptionPane.showMessageDialog(anggotaView, "Downlaod data berhasil \n lokasi file anda: "+path);
//                            }
//                            break;
            }

        } catch (JRException ex) {
            JOptionPane.showMessageDialog(null, "Data tidak dapat dicetak!" + "\n" + ex.getMessage(), "Cetak Data", JOptionPane.ERROR_MESSAGE);
        } catch (Exception e) {
        }
    }
}
